/*!
 * \file frlua_hook.h
 *
 * \brief lua公用管理函数
 *
 * All Rights Reserved Copyright (C) 2014 broada,Co.,Ltd.\n
 * lua公用函数
 *
 * \version 2.0
 * \author yaohl
 * \date 2015/04/21
 *
 */

#ifndef __FRLUA_HOOK_H_
#define __FRLUA_HOOK_H_

#if defined(FRLINUX4) || defined(FRLINUX5)
    extern "C"{
    #include <lua.h>
    }
#else
    #ifdef LIB_APM_LUAJIT
    #include <luajit-2.0/lua.hpp>
    #else
    #include <lua.hpp>
    #endif
#endif

#include "conntrack.h"
#include "module.h"
#include "frreport_comm.h"

/*! @brief lua传递的参数 */
typedef struct __st_lua_params {
    void *p_memstat;                /*!< 内存管理头指针 */
    Conntrack *p_st_conn;           /*!< 当前ct */
    L7_session *p_st_session;       /*!< 当前session */
    Apm_packet *p_st_capdata;       /*!< 当前数据包 */
    Frreport_data *p_st_report_data;/*!< 上报数据 */
} Frlua_params;

/*! @brief lua中调用的c函数 */
typedef struct __st_lua_analyzefun {
    lua_CFunction p_fn;
    const char *p_fnName;
} Frlua_analyzefun;


/*!
 * lua代码加载
 *
 * \param p_lua   (lua内容)
 * \param p_file  (lua内容保存的文件名)
 *
 * \return lua_State *
 *
 */
lua_State *frlua_create_lua_stat(const char *p_lua, const char *p_file);

/*!
 * 检查lua语法
 *
 * \param p_lua         (lua内容)
 * \param pp_error_msg  (lua检查过程错误)
 *
 * \return FR_SUCC:成功\n
 *         FR_FAIL:失败
 *
 * \note pp_error_msg不需要时,可以设置为NULL;pp_error_msg内存需要外部释放
 */
int frlua_check_lua(const char *p_lua, char **pp_error_msg);

/*!
 * lua hook
 *
 * \param p_st_lua_params          (lua需要的参数)
 * \param p_st_analyzefun          (协议解析模块提供的函数一览)
 *
 * \return FR_SUCC:成功\n
 *         FR_FAIL:失败
 *
 */
int frlua_do_hook_module(Frlua_params *p_st_lua_params, Frlua_analyzefun *p_st_analyzefun);

/*!
 * lua hook
 *
 * \param p_memstat                (内存管理地址)
 * \param p_st_conn                (Conntrack *)
 * \param p_st_report_data         (Frreport_data*)
 *
 * \return FR_NO:保留上报数据\n
 *         FR_YES:删除该上报数据
 *
 */
int frlua_do_hook_report(void *p_memstat, lua_State *p_lua_handle, Conntrack *p_st_conn, Frreport_data *p_st_report_data);

#endif
